/**
 * 1. 数据劫持：data 的成员，包括深层属性，以及 data 属性新赋值对象
 * 2. 添加 dep 和 Watcher 的关系
 * 3. 数据变化发送通知
 */
class Observer {constructor(data) {
        this.walk(data);
    }
    walk(data) {
        if(typeof data !== 'object' || data === null) {
            return;
        }
        Object.keys(data).forEach(key => {
            this.defineReactive(data, key, data[key]);
        })
    }
    defineReactive(obj, key, val) {
        let self = this;
        const dep = new Dep();
        this.walk(val);
        Object.defineProperty(obj, key, {
            enumerable: true,
            configurable: true,
            get() {
                Dep.target && dep.addSub(Dep.target);
                return val;
            },
            set(newValue) {
                if(newValue === val) return;
                val = newValue;
                self.walk(newValue);
                dep.notify();
            }
        })
    }
}



